package com.kfm.base.oop3;

import com.kfm.base.oop2.pm.Person;

public class Student extends Person {

    private String name;

    private Integer age;

    private Character gender;

    private String id;

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public Student(String name, int age, Character gender, String id) {
        this.name = name;
        this.age = age;
        this.gender = gender;
        this.id = id;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", gender=" + gender +
                '}';
    }


    /**
     * 重写 equals 要求：
     * 对 null 返回 false
     * 自反性：x.equals(x) 返回true
     * 对称性： x.equals(y) 的值 和 y.equals(x) 的值一样
     * 传递性： x.equals(y) 为 true, y.equals(z) 为 true, 此时 x.equals(z) 为 true
     * 一致性： x.equals(y) 多次调用结果一致
     *  重写了 equals 就要重写 hashCode
     * @param obj
     * @return
     */
    @Override
    public boolean equals(Object obj) {
        // this   obj
        if (obj == null) {
            return false;
        }

        if (this == obj) {
            return true;
        }

        // 学生是同一个对象要求是 学号一样就是同一个
        // 类型转换, 有继承关系 向上转型 和 向下转型
        // Student --> Object  向上转型
//        Object o = this;
        // Object --> student 向下转型 强制类型转换
        Student stu = (Student) obj;
        if (stu.id == this.id || stu.id.equals(this.id)) {
            return true;
        }
        return false;
    }

    /*
        equals 结果为 true hashCode 值一样
        hashCode 一样 equals 结果不一定
     */
    @Override
    public int hashCode() {
       int result = 1;
       result = 31 * result + name.hashCode();
       result = 31 * result + age;
       result = 31 * result + gender;
       result = 31 * result + id.hashCode();

       return result;
    }
}
